package com.scs.application.core.utils;

import java.math.BigDecimal;

/**
 * ${DESCRIPTION}
 */
public class NumberUtils extends org.apache.commons.lang3.math.NumberUtils {

    /**
     * 默认小数类型的精度为2
     */
    private static final int DEFAULT_DECIMAL_SCALE = 2;

    /**
     * 计算多个double类型 值的和
     *
     * @param values 当values中存在一个值为 {@code null}时，这个值将作为 0 处理
     * @return
     */
    public static double sumDouble(Double... values) {
        if (values == null) {
            return 0;
        }
        BigDecimal sum = new BigDecimal(0).setScale(DEFAULT_DECIMAL_SCALE, BigDecimal.ROUND_HALF_UP);
        for (Double value : values) {
            sum = sum.add(new BigDecimal(value == null ? 0 : value).setScale(DEFAULT_DECIMAL_SCALE, BigDecimal.ROUND_HALF_UP));
        }
        return sum.doubleValue();
    }

    /**
     * 计算多个double类型 值的差
     *
     * @param values 当values中存在一个值为 {@code null}时，这个值将作为 0 处理
     * @return
     */
    public static double subtractDouble(Double... values) {
        if (values == null) {
            return 0;
        }
        BigDecimal result = new BigDecimal(values[0]).setScale(DEFAULT_DECIMAL_SCALE, BigDecimal.ROUND_HALF_UP);
        for (int i = 1; i < values.length; i++) {
            result = result.subtract(new BigDecimal(values[i] == null ? 0 : values[i]).setScale(DEFAULT_DECIMAL_SCALE, BigDecimal.ROUND_HALF_UP));
        }
        return result.doubleValue();
    }

    /**
     * 计算多个double类型 值的乘积
     *
     * @param values 当values中存在一个值为 {@code null}时，这个值将作为 0 处理
     * @return
     */
    public static double multiplyDouble(Double... values) {
        if (values == null) {
            return 0;
        }
        BigDecimal multiplyValue = new BigDecimal(1).setScale(DEFAULT_DECIMAL_SCALE, BigDecimal.ROUND_HALF_UP);
        for (Double value : values) {
            multiplyValue = multiplyValue.multiply(new BigDecimal(value == null ? 0 : value).setScale(DEFAULT_DECIMAL_SCALE, BigDecimal.ROUND_HALF_UP));
        }
        return multiplyValue.doubleValue();
    }

}
